package queue

import "container/heap"

// Item 优先级队列信息体
type Item struct {
	//携带信息
	value interface{}
	//优先级
	priority int
	//当前下标
	index int
}

// PriorityQueue 用切片数组表示堆
type PriorityQueue []*Item

// Len 堆节点数
func (p *PriorityQueue) Len() int {
	return len(*p)
}

// Less 比较俩个节点
func (p *PriorityQueue) Less(i, j int) bool {
	return (*p)[i].priority > (*p)[j].priority
}

// Swap 交换俩个节点
func (p *PriorityQueue) Swap(i, j int) {
	(*p)[i], (*p)[j] = (*p)[j], (*p)[i]
	(*p)[i].index = i
	(*p)[j].index = j
}

// Push 添加节点
func (p *PriorityQueue) Push(itemInfo interface{}) {
	item := itemInfo.(*Item)
	item.index = p.Len()
	*p = append(*p, item)
}

// Pop 弹出末尾结点
func (p *PriorityQueue) Pop() interface{} {
	x := (*p)[p.Len()-1]
	x.index = -1
	*p = (*p)[0 : p.Len()-1]
	return x
}

// update 更新修改了优先级和值的item在优先级队列中的位置
func (p *PriorityQueue) update(item *Item, value interface{}, priority int) {
	item.value = value
	item.priority = priority
	heap.Fix(p, item.index)
}
